/**
 * 布尔值
 * 
 * 布尔值实际上并不像“true”或“false”那样存储在布尔变量中。
 * 相反，它们存储为整数：true变为整数1，false变为整数0。
 * 类似地，当评估布尔值时，它们实际上并不评估为“true”或“false”。
 * 它们的计算结果为整数0（假）或1（真）。由于布尔值实际上存储整数，因此它们被视为整数类型。
 * 
 * 当启用 std::boolalpha 时，“0”和“1”将不再被解释为布尔输入（它们都解析为“false”，就像任何非“true”输入一样）。
 * 启用std::boolalpha将只允许接受小写的“false”或“true”。不接受大写字母的变体。
 * 
 */

#include <iostream>

// returns true if x and y are equal, false otherwise
bool isEqual(int x, int y)
{
    return x == y; // operator== returns true if x equals y, and false otherwise
}

int main() {
    bool b1 { true };
    bool b2 { false };
    b1 = false;
    bool b3 {}; // default initialize to false

    bool b11 { !true }; // b11 will be initialized with the value false
    bool b22 { !false }; // b22 will be initialized with the value true


    std::cout << true << '\n'; // true evaluates to 1
    std::cout << !true << '\n'; // !true evaluates to 0

    bool b {false};
    std::cout << b << '\n'; // b is false, which evaluates to 0
    std::cout << !b << '\n'; // !b is true, which evaluates to 1


    std::cout << true << '\n';
    std::cout << false << '\n';

    std::cout << std::boolalpha; // print bools as true or false

    std::cout << true << '\n';
    std::cout << false << '\n';


    bool bFalse { 0 }; // okay: initialized to false
	bool bTrue  { 1 }; // okay: initialized to true
	// bool bNo    { 2 }; // error: narrowing conversions disallowed

	std::cout << bFalse << bTrue << '\n';


    std::cout << std::boolalpha; // print bools as true or false

	bool b111 = 4 ; // copy initialization allows implicit conversion from int to bool
	std::cout << b111 << '\n';

	bool b222 = 0 ; // copy initialization allows implicit conversion from int to bool
	std::cout << b222 << '\n';


    std::cout << "Enter an integer: ";
    int x{};
    std::cin >> x;

    std::cout << "Enter another integer: ";
    int y{};
    std::cin >> y;

    std::cout << x << " and " << y << " are equal? ";
    std::cout << isEqual(x, y) << '\n'; // will return true or false

    return 0;
}